/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Modelo;

import Dao.DAO;
import java.sql.ResultSet;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;

/**
 *
 * @author Andre Luiz
 */
public class Relatorio {

    public class DadosSabores {

        String sabor;
        int num;

        public DadosSabores() {
        }

        public int getNum() {
            return num;
        }

        public void setNum(int num) {
            this.num = num;
        }

        public String getSabor() {
            return sabor;
        }

        public void setSabor(String sabor) {
            this.sabor = sabor;
        }
    }

    public class DadosAcomp {

        String nome;
        int num;

        public DadosAcomp() {
        }

        public int getNum() {
            return num;
        }

        public void setNum(int num) {
            this.num = num;
        }

        public String getNome() {
            return nome;
        }

        public void setNome(String nome) {
            this.nome = nome;
        }
    }

    public class DadosPedidos {

        String codigo;
        String nome;
        String data;
        String valor_entrega;
        String desconto;
        String valor_total;
        String num_pedidos;
        String valor_total_pedidos;
        String valor_medio_pedidos;

        public DadosPedidos() {
        }

        public String getCodigo() {
            return codigo;
        }

        public void setCodigo(String codigo) {
            this.codigo = codigo;
        }

        public String getData() {
            return data;
        }

        public void setData(String data) {
            this.data = data;
        }

        public String getDesconto() {
            return desconto;
        }

        public void setDesconto(String desconto) {
            this.desconto = desconto;
        }

        public String getNome() {
            return nome;
        }

        public void setNome(String nome) {
            this.nome = nome;
        }

        public String getValor_entrega() {
            return valor_entrega;
        }

        public void setValor_entrega(String valor_entrega) {
            this.valor_entrega = valor_entrega;
        }

        public String getValor_total() {
            return valor_total;
        }

        public void setValor_total(String valor_total) {
            this.valor_total = valor_total;
        }

        public String getNum_pedidos() {
            return num_pedidos;
        }

        public void setNum_pedidos(String num_pedidos) {
            this.num_pedidos = num_pedidos;
        }

        public String getValor_total_pedidos() {
            return valor_total_pedidos;
        }

        public void setValor_total_pedidos(String valor_total_pedidos) {
            this.valor_total_pedidos = valor_total_pedidos;
        }

        public String getValor_medio_pedidos() {
            return valor_medio_pedidos;
        }

        public void setValor_medio_pedidos(String valor_medio_pedidos) {
            this.valor_medio_pedidos = valor_medio_pedidos;
        }
    }
    
    public class dadosItensPedido {
        String tipo;
        String nome;
        String valor;
        
        public dadosItensPedido() {
        }

        public String getNome() {
            return nome;
        }

        public void setNome(String nome) {
            this.nome = nome;
        }

        public String getTipo() {
            return tipo;
        }

        public void setTipo(String tipo) {
            this.tipo = tipo;
        }

        public String getValor() {
            return valor;
        }

        public void setValor(String valor) {
            this.valor = valor;
        }
    }
    
    ArrayList<DadosSabores> relSabores = new ArrayList<>();
    ArrayList<DadosAcomp> relAcomp = new ArrayList<>();
    ArrayList<DadosPedidos> relPedidos = new ArrayList<>();
    ArrayList<dadosItensPedido> relItensPedido = new ArrayList<>();
    String dataIni;
    String dataFim;
    String codPedido;

    public ArrayList<DadosSabores> getRelSabores() {
        return relSabores;
    }

    public void setRelSabores(ArrayList<DadosSabores> relatorio) {
        this.relSabores = relatorio;
    }

    public ArrayList<DadosAcomp> getRelAcomp() {
        return relAcomp;
    }

    public void setRelAcomp(ArrayList<DadosAcomp> relAcomp) {
        this.relAcomp = relAcomp;
    }

    public ArrayList<DadosPedidos> getRelPedidos() {
        return relPedidos;
    }

    public void setRelPedidos(ArrayList<DadosPedidos> relPedidos) {
        this.relPedidos = relPedidos;
    }

    public ArrayList<dadosItensPedido> getRelItensPedido() {
        return relItensPedido;
    }

    public void setRelItensPedido(ArrayList<dadosItensPedido> relItensPedido) {
        this.relItensPedido = relItensPedido;
    }

    public String getDataFim() {
        return dataFim;
    }

    public void setDataFim(String dataFim) {
        this.dataFim = dataFim;
    }

    public String getDataIni() {
        return dataIni;
    }

    public void setDataIni(String dataIni) {
        this.dataIni = dataIni;
    }

    public String getCodPedido() {
        return codPedido;
    }

    public void setCodPedido(String codPedido) {
        this.codPedido = codPedido;
    }

    public String getSqlRelPizza() {
        return "Select DISTINCT ON (a.codigo) a.codigo, a.nome, "
                + " ((Select count(c.codigo_sabor_1) From \"ItemPizzaPedido\" as c, \"Pedido\" as e  Where e.codigo=c.codigo_pedido AND e.status != 'Cancelado' AND e.data between '" + dataIni + "' AND '" + dataFim + "' AND c.codigo_sabor_1=a.codigo) + "
                + " (Select count(c.codigo_sabor_2) From \"ItemPizzaPedido\" as c, \"Pedido\" as e  Where e.codigo=c.codigo_pedido AND e.status != 'Cancelado' AND e.data between '" + dataIni + "' AND '" + dataFim + "' AND  c.codigo_sabor_2=a.codigo) + "
                + " (Select count(c.codigo_sabor_3) From \"ItemPizzaPedido\" as c, \"Pedido\" as e  Where e.codigo=c.codigo_pedido AND e.status != 'Cancelado' AND e.data between '" + dataIni + "' AND '" + dataFim + "' AND  c.codigo_sabor_3=a.codigo) +"
                + " (Select count(c.codigo_sabor_4) From \"ItemPizzaPedido\" as c, \"Pedido\" as e  Where e.codigo=c.codigo_pedido AND e.status != 'Cancelado' AND e.data between '" + dataIni + "' AND '" + dataFim + "' AND  c.codigo_sabor_4=a.codigo))  as num"
                + " From \"Sabor\" AS a, \"ItemPizzaPedido\" as b, \"Pedido\" as d"
                + " WHERE b.codigo_sabor_1=a.codigo AND d.codigo=b.codigo_pedido AND d.status != 'Cancelado' AND d.data between '" + dataIni + "' AND '" + dataFim + "'"
                + " OR b.codigo_sabor_2=a.codigo AND d.codigo=b.codigo_pedido AND d.status != 'Cancelado' AND d.data between '" + dataIni + "' AND '" + dataFim + "'"
                + " OR b.codigo_sabor_3=a.codigo AND d.codigo=b.codigo_pedido AND d.status != 'Cancelado' AND d.data between '" + dataIni + "' AND '" + dataFim + "'"
                + " OR b.codigo_sabor_4=a.codigo AND d.codigo=b.codigo_pedido AND d.status != 'Cancelado' AND d.data between '" + dataIni + "' AND '" + dataFim + "' ";
    }

    public String getSqlRelAcompanhamentos() {
        return "Select c.codigo, c.nome, count(c.codigo)As num "
                + " From \"ItemAcompanhamentoPedido\" as a, \"Pedido\" as b, \"Acompanhamento\" as c "
                + " Where b.codigo=a.codigo_pedido AND a.codigo_acompanhamento = c.codigo AND b.status != 'Cancelado' AND b.data between '" + dataIni + "' AND '" + dataFim + "' "
                + "group by c.codigo, c.nome order by num";
    }

    public String getSqlRelReceita() {
        return "Select count(codigo)as num_pedidos, sum(valor_total)as total "
                + " From \"Pedido\" "
                + " Where status != 'Cancelado' AND data between between '" + dataIni + "' AND '" + dataFim + "'";
    }

    public String getSqlRelPedidos() {
        return "Select a.codigo, b.nome, a.data, a.valor_entrega, a.desconto, a.valor_total, "
                + " (Select count(codigo) From \"Pedido\" Where status != 'Cancelado' AND data between '" + dataIni + "' AND '" + dataFim + "') as num_pedidos, "
                + " (Select sum(valor_total) From \"Pedido\" Where status != 'Cancelado' AND data between '" + dataIni + "' AND '" + dataFim + "') as valor_total_pedidos,"
                + " (Select avg(valor_total) From \"Pedido\" Where status != 'Cancelado' AND data between '" + dataIni + "' AND '" + dataFim + "') as valor_medio_pedidos"
                + " From \"Pedido\" as a, \"Cliente\" as b "
                + " Where b.codigo=a.codigo_cliente AND status != 'Cancelado' AND data between '" + dataIni + "' AND '" + dataFim + "'";
    }
    
    public String getSqlRelItensPedPizza() {
        return "Select codigo_pizza_pedido, "
                + " (Select nome From \"Sabor\" as f Where b.codigo_sabor_1=f.codigo) as sabor1,"
                + " (Select nome From \"Sabor\" as f Where b.codigo_sabor_2=f.codigo) as sabor2,"
                + " (Select nome From \"Sabor\" as f Where b.codigo_sabor_3=f.codigo) as sabor3,"
                + " (Select nome From \"Sabor\" as f Where b.codigo_sabor_4=f.codigo) as sabor4,"
                + " (Select nome From \"Categoria\" as g Where g.codigo = (Select codigo_categoria From \"Sabor\" as f Where b.codigo_sabor_1=f.codigo)) as categ1,"
                + " (Select tamanho From \"Categoria\" as g Where g.codigo = (Select codigo_categoria From \"Sabor\" as f Where b.codigo_sabor_1=f.codigo)) as tamanhocateg1,"
                + " (Select nome From \"Categoria\" as g Where g.codigo = (Select codigo_categoria From \"Sabor\" as f Where b.codigo_sabor_1=f.codigo)) as categ2,"
                + " (Select tamanho From \"Categoria\" as g Where g.codigo = (Select codigo_categoria From \"Sabor\" as f Where b.codigo_sabor_1=f.codigo)) as tamanhocateg2,"
                + " (Select nome From \"Categoria\" as g Where g.codigo = (Select codigo_categoria From \"Sabor\" as f Where b.codigo_sabor_1=f.codigo)) as categ3,"
                + " (Select tamanho From \"Categoria\" as g Where g.codigo = (Select codigo_categoria From \"Sabor\" as f Where b.codigo_sabor_1=f.codigo)) as tamanhocateg3,"
                + " (Select nome From \"Categoria\" as g Where g.codigo = (Select codigo_categoria From \"Sabor\" as f Where b.codigo_sabor_1=f.codigo)) as categ4,"
                + " (Select tamanho From \"Categoria\" as g Where g.codigo = (Select codigo_categoria From \"Sabor\" as f Where b.codigo_sabor_1=f.codigo)) as tamanhocateg4,"
                + " b.valor"
                + " From \"Pedido\" as a, \"ItemPizzaPedido\" as b"
                + " Where a.codigo=b.codigo_pedido AND a.status != 'Cancelado' AND a.codigo="+codPedido;
    }
    
    public String getSqlRelItensPedAcomp() {
        return "Select (Select nome From \"Acompanhamento\"as d Where d.codigo=c.codigo_acompanhamento)As nome , c.valor"
        + " From \"Pedido\" as a, \"ItemAcompanhamentoPedido\" as c "
        + " Where a.codigo=c.codigo_pedido AND a.status != 'Cancelado' AND a.codigo="+codPedido;
    }
    

    public boolean setALL_Sabores(ResultSet rs, boolean nextInicial) {
        try {
            while (rs.next()) {
                DadosSabores d = new DadosSabores();
                d.sabor = rs.getString("nome");
                d.num = rs.getInt("num");

                if (!jaExiste(d)) {
                    relSabores.add(d);
                }
            }
            ordenarSabores();
            return true;
        } catch (Exception ex) {
            ex.printStackTrace();
            System.out.println(ex.getMessage());
            return false;
        }
    }

    public boolean setALL_Acomp(ResultSet rs, boolean nextInicial) {
        try {
            while (rs.next()) {
                DadosAcomp d = new DadosAcomp();
                d.nome = rs.getString("nome");
                d.num = rs.getInt("num");

                relAcomp.add(d);
            }
            return true;
        } catch (Exception ex) {
            ex.printStackTrace();
            System.out.println(ex.getMessage());
            return false;
        }
    }

    public boolean setALL_Pedidos(ResultSet rs, boolean nextInicial) {
        Locale locale = new Locale("pt", "BR");
        NumberFormat formatter = DecimalFormat.getCurrencyInstance(locale);
        try {
            while (rs.next()) {
                DadosPedidos d = new DadosPedidos();
                d.codigo = rs.getString("codigo");
                d.nome = rs.getString("nome");
                d.data = rs.getString("data");
                d.valor_entrega = formatter.format(rs.getFloat("valor_entrega"));
                d.desconto = formatter.format(rs.getFloat("desconto"));
                d.valor_total = formatter.format(rs.getFloat("valor_total"));
                d.num_pedidos = rs.getString("num_pedidos");
                d.valor_total_pedidos = formatter.format(rs.getFloat("valor_total_pedidos"));
                d.valor_medio_pedidos = formatter.format(rs.getFloat("valor_medio_pedidos"));

                relPedidos.add(d);
            }
            return true;
        } catch (Exception ex) {
            ex.printStackTrace();
            System.out.println(ex.getMessage());
            return false;
        }
    }
    
    public boolean setALL_ItensPedido(ResultSet rs, ResultSet rs2, boolean nextInicial) {
        Locale locale = new Locale("pt", "BR");
        NumberFormat formatter = DecimalFormat.getCurrencyInstance(locale);
        try {
            while (rs!= null && rs.next()) {
                dadosItensPedido d = new dadosItensPedido();
                String sabores="";
                String tamanho="";
                String categoria="";
                d.tipo = "Pizza";
                if(rs.getString("sabor1")!=null && !"".endsWith(rs.getString("sabor1"))){
                    sabores += ", "+rs.getString("sabor1");
                    tamanho=rs.getString("tamanhocateg1");
                    categoria=rs.getString("categ1");
                }
                if(rs.getString("sabor2")!=null && !"".endsWith(rs.getString("sabor2"))){
                    sabores += ", "+rs.getString("sabor2");
                    tamanho=rs.getString("tamanhocateg2");
                    categoria=rs.getString("categ2");
                }
                if(rs.getString("sabor3")!=null && !"".endsWith(rs.getString("sabor3"))){
                    sabores += ", "+rs.getString("sabor3");
                    tamanho=rs.getString("tamanhocateg3");
                    categoria=rs.getString("categ3");
                }
                if(rs.getString("sabor4")!=null && !"".endsWith(rs.getString("sabor4"))){
                    sabores += ", "+rs.getString("sabor4");
                    tamanho=rs.getString("tamanhocateg4");
                    categoria=rs.getString("categ4");
                }
                
                d.nome = sabores.replaceFirst(",", "") +" Tamanho: "+tamanho+" Categoria: "+categoria;
                d.valor = formatter.format(rs.getFloat("valor"));

                relItensPedido.add(d);
            }
            
            while (rs2!= null && rs2.next()) {
                dadosItensPedido d = new dadosItensPedido();
                d.tipo="Acomp";
                d.nome=rs2.getString("nome");
                d.valor = formatter.format(rs2.getFloat("valor"));
            }
            
            return true;
        } catch (Exception ex) {
            ex.printStackTrace();
            System.out.println(ex.getMessage());
            return false;
        }
    }

    public boolean jaExiste(DadosSabores d) {
        for (int i = 0; i < relSabores.size(); i++) {
            if (relSabores.get(i).sabor.equalsIgnoreCase(d.getSabor())) {
                relSabores.get(i).num += d.getNum();
                return true;
            }
        }
        return false;
    }

    public void ordenarSabores() {
        ArrayList<DadosSabores> aux = new ArrayList<>();
        int max;
        int index;

        while (relSabores.size() > 0) {
            max = Integer.MIN_VALUE;
            index = 0;
            for (int i = 0; i < relSabores.size(); i++) {
                if (relSabores.get(i).num > max) {
                    max = relSabores.get(i).num;
                    index = i;
                }
            }
            aux.add(relSabores.remove(index));
        }

        setRelSabores(aux);
    }

   
}
